/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.soa.util.rsgl;

import com.lianzt.util.DateUtil;
import com.soa.exception.GlobalException;
import com.soa.util.SystemUtil;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 工具类
 * @author zuotai
 */
@Component
public class RsglUtil {

    public int serialCache = 1000;         //流水号
    private final Logger log = LoggerFactory.getLogger(RsglUtil.class);

    /**
     * 获取流水号
     * 说明：当要调整为分布式部署时，需要修改此函数，流水号后几位要保存在redis中，每次获取之后都进行加一操作（直接在redis中加1），并在每天凌晨重置。
     * 流水号格式为：A + yyyyMMddHHmmss + N + xxxx； N为服务器节点，xxxx为4位序列号
     *
     * @return
     */
    public String getSerialNum() {
        try {
            if (serialCache >= 9999) {
                serialCache = 1000;
            } else {
                serialCache++;
            }
            return "A" + DateUtil.detaledLshFormat(new Date()) + SystemUtil.getSysConfig("server_node") + serialCache;
        } catch (Exception e) {
            log.error("流水号更新异常 : " + e);
            throw new GlobalException(999995);     //生成流水号异常
        }
    }
     /**
     * Note:Spring 牵扯到多线程调用一个服务的现象，故类中变量不能为成员变量，只能为局部变量
     *
     * @param file 上传得到的字节数组文件
     * @param sys_path 保存文件模块的地址
     * @param module_name 你要上传文件所在模块的名字
     * @param fileName 文件的名字
     * @return 返回路径的相对路径
     * @throws IOException 文件不能关闭的异常
     * @author wgp
     */
    public String upLoad(byte[] file, String sys_path, String module_name, String fileName) throws IOException {
        String filepath = SystemUtil.getSysConfig(sys_path);
        String serverRoot = SystemUtil.getSysConfig("server_name");//服务器的根目录
        BufferedOutputStream bos = null;
        String extension = getFileExtension(fileName);//获取文件的扩展名
        //上传的个人照片模块的，都改成png格式。excel导出照片只支持png格式照片
        if("grzp".equals(module_name)){
            if(!"png".equals(extension)){
                extension="png";
            }
        }
        String line = File.separator;//通用文件分割符
        String _Path = line + serverRoot + line + module_name;
        String rel_path = filepath + _Path;//得到绝对路径
        File newPath = null;
        newPath = new File(rel_path);
        if (!newPath.exists() && !newPath.isDirectory()) {//创建文件夹，如果不存在则创建
            newPath.mkdirs();
        }
        try {
            String dbFileName = SystemUtil.getSerialNum() + "." + extension;
            String dbFilePath = module_name+line + dbFileName;//数据库中要保存的相对路径及文件名
//            dbFilePath = dbFilePath.replaceAll("\\\\", "/");
            String filePath = rel_path + line + dbFileName;//绝对路径，就是要写文件的名字
            bos = new BufferedOutputStream(new FileOutputStream(filePath));     //最终的文件带文件名和扩展名
            bos.write(file);
            bos.flush();
            return dbFilePath;
        } finally {
            if (bos != null) {//用套节流进行操作时只用关闭外层的流即可
                try {
                    bos.close();
                } catch (IOException e) {
                    log.warn("close file error:", e);
                }
            }
        }
    }

    /**
     * 将数据中的相对路径转换成绝对路径
     *
     * @param dbPath
     * @return
     */
    public String getRelPath(String dbPath) {
        String _path = SystemUtil.getSysConfig("za0001_file_path1");
         String line = File.separator;//通用文件分割符
        return _path +line+dbPath;
        
    }

    /**
     * 获得文件的扩展名
     *
     * @param fileName 文件的名字
     * @return 返回文件的扩展名
     */
    private String getFileExtension(String fileName) {
        if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        } else {
            return "";
        }
    }

    public boolean deleteFile(String path) {
        File file = new File(path);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除  
        if (path != null) {
            if (file.exists() && file.isFile()) {
                if (file.delete()) {
                    return true;
                } else {
                    log.debug("error:", "删除文件出错");
                    return false;
                }
            } else {
                return true;//文件不存在
            }
        } else {
            return true;
        }
    }

    /**
     *
     * @param file 字节数组
     * @param sys_path
     * @param module_name 模块的名称
     * @param fileName 文件的名字
     * @return
     * @throws IOException
     */
    public String upLoadIDPicture(byte[] file, String sys_path, String module_name, String fileName) throws IOException {
        String filepath = SystemUtil.getSysConfig(sys_path);
        String serverRoot = SystemUtil.getSysConfig("za0001_server_root");//服务器的根目录
        BufferedOutputStream bos = null;
        String line = File.separator;//通用文件分割符
        String _Path = line + serverRoot + line + module_name;
        String rel_path = filepath + _Path;//得到绝对路径
        File newPath = null;
        newPath = new File(rel_path);
        if (!newPath.exists() && !newPath.isDirectory()) {//创建文件夹，如果不存在则创建
            newPath.mkdirs();
        }
        try {
            String dbFileName = fileName + "." + "jpg";
            String dbFilePath = _Path + line + dbFileName;//数据库中要保存的相对路径及文件名
            String filePath = rel_path + line + dbFileName;//绝对路径，就是要写文件的名字
            bos = new BufferedOutputStream(new FileOutputStream(filePath));     //最终的文件带文件名和扩展名
            bos.write(file);
            bos.flush();
            return dbFilePath;
        } finally {
            if (bos != null) {//用套节流进行操作时只用关闭外层的流即可
                try {
                    bos.close();
                } catch (IOException e) {
                    log.warn("close file error:", e);
                }
            }
        }
    }
    /**
     * 照片上传到108服务器上
     * */
    public  void Upload(String type,String filename){
        String targetURL = null;// TODO 指定URL
  //      File targetFile1 = new File("D:\\我的文档\\图片\\gx\\1.jpg");// TODO 指定上传文件
  //      File targetFil2 = new File("D:\\我的文档\\图片\\gx\\2.jpg");// TODO 指定上传文件
  //      File targetFile3 = new File("D:\\我的文档\\图片\\gx\\3.jpg");// TODO 指定上传文件
//        System.out.println(targetFile.isFile());
        targetURL = SystemUtil.getSysConfig("upload_host"); //servleturl
        //获取文件夹路径
        String file = SystemUtil.getSysConfig("img_url");
        File targetFile1 = null;
        if(type!=null&&!"".equals(type)){
            if("image".equals(type)){
                targetFile1 = new File(file+"\\"+type+"\\"+filename+".jpg");
            }else if("voice".equals(type)){
                targetFile1 = new File(file+"\\"+type+"\\"+filename+".mp3");
            }
        }
        
       // File targetFile1 = new File(file+""+filename+".jpg");
        PostMethod filePost = new PostMethod(targetURL);

        try {
            //通过以下方法可以模拟页面参数提交
            //filePost.setParameter("name", "中文");
            //filePost.setParameter("pass", "1234");
            String time = DateUtil.detaledLshFormat(new Date());
            Part[] parts = {new FilePart("1", targetFile1)};
            filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
            HttpClient client = new HttpClient();
            client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
            System.out.println("开始上传");
            int status = client.executeMethod(filePost);
            System.out.println(filePost.getResponseBodyAsString());
            if (status == HttpStatus.SC_OK) {
                System.out.println("上传成功");
                // 上传成功
            } else {
                System.out.println("上传失败");
                // 上传失败
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            filePost.releaseConnection();
        }
    }
}
